#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <string>
#include <cstdlib>
#include <thread>
#include <stdio.h>
using namespace std;


string  toHex(pthread_t tid)
{
    char hex[64];
    snprintf(hex,sizeof(hex),"%p",tid);//--------
    return hex;
}

void* threadrun(void* args)
{
    while(true)
    {
        cout<<"thread id: "<<toHex(pthread_self())<<endl;
        sleep(1);
    }
    return nullptr;
}


int main()
{
    pthread_t tid;
    pthread_create(&tid,nullptr,threadrun,(void*)"thread 1");
    cout<<"main thread create thread done,new thread id :"<<toHex(tid)<<endl;
    pthread_join(tid,nullptr);
    return 0;
}





// //c++11的多线程
// void threadrun()
// {
//     while(true)
//     {
//         cout<<"i am a new thread for c++"<<endl;
//         sleep(1);
//     }
// }
// int main()
// {
//     thread t1(threadrun);
//     t1.join();
//     return 0;
// }







// class Request
// {
// public:
//     Request(int start,int end,const string& threadname)
//         :_start(start)
//         ,_end(end)
//         ,_threadname(threadname)
//         {}
// public:
//     int _start;
//     int _end;
//     string _threadname;
// };


// class Response
// {
// public:
//     Response(int result,int exitcode)
//         :result_(result),exitcode_(exitcode)
//         {}
// public:
//     int result_;//计算结果
//     int exitcode_;//计算结果是否可靠
// };


// void* sumCount(void* args)
// {
//     Request* rq=static_cast<Request*>(args);//------安全的强转
//     Response *rsp=new Response(0,0);
//     for(int i=rq->_start;i<=rq->_end;i++)
//     {
//         rsp->result_+=i;
//     }
//     return rsp;
// }
// int main()
// {
//     Request* rq=new Request(1,100,"thread 1");
//     pthread_t tid;
//     pthread_create(&tid,nullptr,sumCount,rq);
//     void* retval;
//     pthread_join(tid,&retval);
//     Response *rsp=static_cast<Response*>(retval);
//     cout<<"result:"<<rsp->result_<<" "<<"exitcode:"<<rsp->exitcode_<<endl;
//     return 0;
// }














// int g_val =100;
// void show(const string& name)
// {
//     cout<<name.c_str()<<"say# "<<"hello thread"<<endl;
// }

// void* threadRoutine(void* args)
// {
//     int cnt=5;
//     const char* name=(const char*)args;
//     while(true)
//     {
//         // cout<<"new thread,id : "<<getpid()<<" , g_val:"<<g_val<<endl;
//         // show("new thread ");
//         cout<<name<<endl;
//         sleep(1);
//         cnt--;
//         if(cnt==0) break;
//     }
//     // exit(11);
//     pthread_exit((void*)100);
//     return (void*)1;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,threadRoutine,(void*)"thread 1");
//     sleep(1);
//     pthread_cancel(tid);
//     // while(true)
//     // {
//     //     // cout<<"main thread,id : "<<getpid()<<"create new thread id:"<<tid<<endl;
//     //     show("main thread ");
//     //     sleep(1);
//     //     // g_val++;
//     // }
//     void* retval;
//     pthread_join(tid,&retval);
//     cout<<(long long int)retval<<endl;
//     cout<<"main thread quit..."<<endl;
//     return 0;
// }